package puzzlegame.iml;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class GameFrame extends JFrame implements KeyListener, ActionListener {
    int date[][]=new int[4][4];
    int x,y;
    //拼图的正确答案
    int [][]win=new int[][]{
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,0}
    };
    //定义一个变量,显示路径
    String path="split-images\\split-";
    //统计步数
    int step=0;
    //创建选项条目
    JMenuItem replayItem=new JMenuItem("重新游戏");
    JMenuItem reLoginItem=new JMenuItem("重新登陆");
    JMenuItem closeItem=new JMenuItem("关闭游戏");
    JMenuItem accountItem=new JMenuItem("公众号");
    public GameFrame(){
        //初始化窗口
        InitJFrame();
        //初始化菜单
        InitJMenuBar();
        //初始化数据
        InitDate();
        //初始化图片
        InitImage();
        //显示界面,最好写在最后
        this.setVisible(true);
    }
    private void InitDate(){
        //创建一个一维数组
        int arr[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        //打乱一维数组
        Random ret=new Random();
        for(int i=0;i<arr.length;i++)
        {
            int index=ret.nextInt(arr.length);
            int tmp=arr[i];
            arr[i]=arr[index];
            arr[index]=tmp;
        }
        //给数组赋值
       for(int i=0;i<arr.length;i++)
       {
           //获取空白图片位置
           if(arr[i]==0)
           {
               x=i/4;
               y=i%4;
           }
           date[i/4][i%4]=arr[i];
       }
    }
    private void InitImage(){
        //清空原本出现的图片
        this.getContentPane().removeAll();
        //判断拼图是否正确
        if(victory())
        {
            JLabel vic=new JLabel(new ImageIcon("split-images/微信图片_20250922173307.jpg"));
            vic.setBounds(203,283,197,73);
            this.getContentPane().add(vic);
        }
        //设置步数
        JLabel stepCount=new JLabel("步数:"+step);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++)
            {
                int num=date[i][j];
                //创建图片
                //图片放入管理容器中，相对路径
                JLabel jlabel=new JLabel(new ImageIcon(path+num+".png"));
                //指定图片位置
                jlabel.setBounds(105*j+83,105*i+134,105,105);
                //图片添加边框
                jlabel.setBorder(new BevelBorder(0));
                //添加到界面中
                this.getContentPane().add(jlabel);
            }
        }
        //添加背景图片：先添加的图片在上面
        JLabel backgound=new JLabel(new ImageIcon("split-images/微信图片_20250922173223.jpg"));
        backgound.setBounds(40,40,508,560);
        this.getContentPane().add(backgound);
        //刷新一下界面
        this.getContentPane().repaint();
    }

    private void InitJMenuBar() {
        //创建菜单对象
        JMenuBar jmenubar=new JMenuBar();
        //创建菜单选项
        JMenu functionJMenu=new JMenu("功能");
        JMenu aboutJMenu=new JMenu("关于我们");
        //给条目绑定动作监听
        replayItem.addActionListener(this);
        reLoginItem.addActionListener(this);
        closeItem.addActionListener(this);
        accountItem.addActionListener(this);
        //条目添加到选项
        functionJMenu.add(replayItem);
        functionJMenu.add(reLoginItem);
        functionJMenu.add(closeItem);
        aboutJMenu.add(accountItem);
        //选项添加到菜单
        jmenubar.add(functionJMenu);
        jmenubar.add(aboutJMenu);
        //给整个界面添加菜单
        this.setJMenuBar(jmenubar);
    }

    private void InitJFrame() {
        //设置界面宽高
        this.setSize(603,680);
        //设置界面标题
        this.setTitle("拼图 游戏");
        //界面置顶
        this.setAlwaysOnTop(true);
        //界面居中
        this.setLocationRelativeTo(null);
        //设置关闭模式
        this.setDefaultCloseOperation(3);
        //取消管理容器默认居中放置
        this.setLayout(null);
        //添加键盘监听
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        //按A不松显示完整图片
        int code=e.getKeyCode();
        if(code==65)
        {
            //清空原来的图片
            this.getContentPane().removeAll();
            //添加完整图片
            JLabel all=new JLabel(new ImageIcon(path+"all.png"));
            all.setBounds(83,134,420,420);
            this.getContentPane().add(all);
            //添加背景图片
            JLabel backgound=new JLabel(new ImageIcon("split-images/OIP-C.jfif"));
            backgound.setBounds(40,40,508,560);
            this.getContentPane().add(backgound);
            //刷新界面
            this.getContentPane().repaint();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        int code=e.getKeyCode();
        //如果拼图成功,便不能左右上下移动
        if(victory())
        {
            return;
        }
        //移动图片
        switch(code){
            //左移
            case 37:
                if(y==3)
                    return;
                date[x][y]=date[x][y+1];
                date[x][y+1]=0;
                y++;
                //走一步步数加一次
                step++;
                break;
            //上移
            case 38:
                if(x==3)
                    return;
                date[x][y]=date[x+1][y];
                date[x+1][y]=0;
                x++;
                //走一步步数加一次
                step++;
                break;
            //右移
            case 39:
                if(y==0)
                    return;
                date[x][y]=date[x][y-1];
                date[x][y-1]=0;
                y--;
                //走一步步数加一次
                step++;
                break;
            //下移
            case 40:
                if(x==0)
                    return;
                date[x][y]=date[x-1][y];
                date[x-1][y]=0;
                x--;
                //走一步步数加一次
                step++;
                break;
            case 65:
                InitImage();
                break;
                //W键一键通关
            case 87:
                date=new int[][]{
                        {1,2,3,4},
                        {5,6,7,8},
                        {9,10,11,12},
                        {13,14,15,0}
                };
                break;
            default:
                break;
        }
        InitImage();
    }
    //写一个方法判断是否成功
    public boolean victory(){
        for(int i=0;i<date.length;i++)
        {
            for(int j=0;j<date[i].length;j++)
            {
                if(date[i][j]!=win[i][j])
                    return false;
            }
        }
        return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        //实现重新游戏
        if(e.getSource()==replayItem)
        {
            //清空步数
            step=0;
            //打乱图片
            InitDate();
            //重新加载图片
            InitImage();
        }
        //实现重新登录
        else if(e.getSource()==reLoginItem)
        {
            //关闭当前界面
            this.setVisible(false);
            //重新登录
            new LoginFrame();
        }
        //实现关闭游戏
        else if(e.getSource()==closeItem)
        {
            System.exit(0);
        }
        //实现关于我们
        else if(e.getSource()==accountItem)
        {
            //创建一个JDialog弹框对象
            JDialog jDialog=new JDialog();
            //创建一个管理容器
            JLabel jLabel=new JLabel(new ImageIcon("split-images/微信图片_20250529203949.jpg"));
            //设置宽高
            jLabel.setBounds(0,0,258,258);
            //将容器放入弹框
            jDialog.getContentPane().add(jLabel);
            //设置弹框大小
            jDialog.setSize(344,344);
            //弹框置顶
            jDialog.setAlwaysOnTop(true);
            //弹框居中
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭,无法进行操作
            jDialog.setModal(true);
            //显示弹框
            jDialog.setVisible(true);
        }
    }
}
